package dao

import (
	"fmt"
	"gorm.io/gorm"
	"log"
	"lottery/comm"
	"lottery/models"
)

type GiftDao struct {
	engine *gorm.DB
}

// 公共方法，实例化方法
func NewGiftDao(engine *gorm.DB) *GiftDao {
	return &GiftDao{
		engine: engine,
	}
}

// 查找单一值
func (d *GiftDao) Get(id int) (*models.LtGift, bool) {
	data := &models.LtGift{}
	// 查询数据
	err := d.engine.First(&data, id).Error
	if err != nil { // 未获取到，得到的是空对象
		return data, false
	}
	return data, true
}

// 查找全部
func (d *GiftDao) GetAll() ([]models.LtGift, bool) {
	datalist := make([]models.LtGift, 0)
	// 返回所有数据，按照状态和 删除
	err := d.engine.Order("sys_status").
		Find(&datalist).Error
	if err != nil { // 错误了，写个日志
		log.Println("gift_dao.GetAll error = ", err.Error())
		return datalist, false
	}
	return datalist, true
}

// 查找总数
func (d *GiftDao) CountAll() int64 {
	var num int64
	d.engine.Table("lt_gifts").Count(&num)
	return num
}

// 删除操作不做物理删除， 逻辑删除，更新字段
func (d *GiftDao) Delete(id int) error {
	data := &models.LtGift{Id: id}
	err := d.engine.Model(&data).
		Update("sys_status", 1).Error

	return err
}

// 更新操作: 针对传入的指定 columns，字段名，进行查询
func (d *GiftDao) Update(data *models.LtGift, columns []string) error {
	err := d.engine.Model(data).Select(columns).Updates(data).Error
	return err
}

// 执行创建操作
func (d *GiftDao) Create(data *models.LtGift) error {
	err := d.engine.Create(data).Error
	return err
}

// 获取到当前可以获取的奖品列表
// 限定： 有奖品限定, 状态正常, 时间期间内
// 排序： gtype倒叙, displayorder正序
func (d *GiftDao) GetAllUser() []models.LtGift {
	now := comm.NowUnix()
	datalist := make([]models.LtGift, 0)
	// 指定需要查询出来的数据列Select 限定查询字段。
	err := d.engine.
		Select("id", "title", "prize_num", "left_num", "prize_code",
			"prize_time", "img", "displayorder", "gtype", "gdata").
		Order("gtype desc").
		Order("displayorder asc").
		Where("sys_status = ? ", 0).
		Where("time_begin <= ? and time_end >= ?", now, now).
		Find(&datalist).Error
	if err != nil {
		log.Println("gift_dao.GetAllUse error = ", err)
	}
	fmt.Println("GetAllUser..................len = ", len(datalist))
	return datalist
}

// 实现数据递减的操作
func (d *GiftDao) DecrLeftNum(id, num int) (int64, error) {
	// TODO: 待补充
	rst := d.engine.Model(&models.LtGift{}).Where("id = ?", id).Update("left_num", num)
	return rst.RowsAffected, rst.Error
}

// 递增操作
func (d *GiftDao) IncrLeftNum(id, num int) (int64, error) {
	// TODO：待补充
	rst := d.engine.Model(&models.LtGift{}).Where("id = ?", id).Update("left_num", num)
	return rst.RowsAffected, rst.Error
}
